package com.example.foodsy.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.foodsy.dto.Result;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.foodsy.utils.JwtUtils;
import com.example.foodsy.utils.Result;
import com.example.foodsy.entity.CompanyInfo;
import com.example.foodsy.mapper.CompanyInfoMapper;
import com.example.foodsy.service.CompanyInfoService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.List;
import org.springframework.util.StringUtils;

/**
 * <p>
 * 节点企业信息表	 服务实现类
 * </p>
 *
 * @author cgc
 * @since 2025-09-23
 */
@Service
public class CompanyInfoServiceImpl extends ServiceImpl<CompanyInfoMapper, CompanyInfo> implements CompanyInfoService {
    @Autowired
    private JwtUtils jwtUtils;
    @Autowired
    private PasswordEncoder passwordEncoder;

	@Override
	public Result login(String loginCode, String loginPassword) {
        // 1. 先根据登录编码查询企业信息
        LambdaQueryWrapper<CompanyInfo> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(CompanyInfo::getLoginCode, loginCode);
        CompanyInfo company = getOne(wrapper);

        if (company != null) {
            // 2. 使用PasswordEncoder验证密码
            if (passwordEncoder.matches(loginPassword, company.getLoginPassword())) {
                // 3. 密码验证通过，生成JWT令牌
                String token = jwtUtils.generateToken(company.getId(), "COMPANY");
                return Result.ok(token);
            }
        }
        // 登录编码不存在或密码错误，统一返回相同提示（避免信息泄露）
        return Result.fail("登录编码或密码错误");
	}


    //分页查询重点企业（适配Result.ok(List, total)）
    @Override
    public Result pageModelInfo(Integer current, Integer size, String provId, String cityId) {
        try {
            //1.构建分页信息
            Page<CompanyInfo> page = new Page<>(current, size);
            //2.构建查询条件
            LambdaQueryWrapper<CompanyInfo> wrapper = new LambdaQueryWrapper<>();
            if (StringUtils.hasText(provId)){
                wrapper.eq(CompanyInfo::getProvId, provId);
            }
            if (StringUtils.hasText(cityId)){
                wrapper.eq(CompanyInfo::getCityId, cityId);
            }
            //3.执行分页查询
            Page<CompanyInfo> resultPage = page(page, wrapper);
            //4.返回结果
            return Result.ok(resultPage.getRecords(), resultPage.getTotal());
        } catch (Exception e) {
            return Result.fail("分页查询企业失败：" + e.getMessage());
        }
    }

    //按省份编码统计企业数量（用Result.ok(data)返回单个数值）
    @Override
    public Result countByProvinceCode(String provId) {
         try {
            if (!StringUtils.hasText(provId)) {
                return Result.fail("省份编码不能为空");
            }
            LambdaQueryWrapper<CompanyInfo> wrapper = new LambdaQueryWrapper<>();
            wrapper.eq(CompanyInfo::getProvId, provId);
            Long count = count(wrapper);
            return Result.ok(count); // 返回统计数量（单个数据）
        } catch (Exception e) {
            return Result.fail("统计企业数量失败：" + e.getMessage());
        }
    }

    /**
     * 系统管理端新增企业（仅管理员可操作）
     */
    @Override
    public Result saveModelInfo(CompanyInfo companyInfo) {
        try {
            // 1. 校验参数（补充loginCode唯一性校验）
            if (companyInfo == null || !StringUtils.hasText(companyInfo.getName())) {
                return Result.fail("企业名称不能为空");
            }
            String loginCode = companyInfo.getLoginCode();
            String loginPassword = companyInfo.getLoginPassword();
            if (!StringUtils.hasText(loginCode) || !StringUtils.hasText(loginPassword)) {
                return Result.fail("登录编码或密码不能为空");
            }

            // 新增：检查loginCode是否已存在
            LambdaQueryWrapper<CompanyInfo> wrapper = new LambdaQueryWrapper<>();
            wrapper.eq(CompanyInfo::getLoginCode, loginCode);
            if (count(wrapper) > 0) {
                return Result.fail("登录编码已被占用，请更换");
            }

            // 2. 加密登录密码
            String encodedPassword = passwordEncoder.encode(loginPassword);
            companyInfo.setLoginPassword(encodedPassword);

            // 3. 保存到数据库
            boolean success = save(companyInfo);
            return success ? Result.ok("企业新增成功") : Result.fail("新增企业失败");
        } catch (Exception e) {
            return Result.fail("新增企业异常：" + e.getMessage());
        }
    }


    /**
     * 企业修改自身密码（仅当前登录企业可操作）
     */
    @Override
    public Result updatePassword(Integer companyId, String oldPassword, String newPassword) {
        // 1. 查询当前企业信息
        CompanyInfo company = getById(companyId);
        if (company == null) {
            return Result.fail("企业不存在");
        }

        // 2. 验证原密码（必须正确）
        boolean oldPasswordMatch = passwordEncoder.matches(oldPassword, company.getLoginPassword());
        if (!oldPasswordMatch) {
            return Result.fail("原密码错误");
        }

        // 3. 加密新密码并更新
        String encodedNewPassword = passwordEncoder.encode(newPassword);
        company.setLoginPassword(encodedNewPassword);
        boolean success = updateById(company);

        return success ? Result.ok("密码修改成功") : Result.fail("密码修改失败");
    }

    @Override
    public Result getCompanyById(Integer companyId) {
        try {
            if (companyId == null) {
                return Result.fail("企业ID不能为空");
            }
            CompanyInfo company = getById(companyId);
            if (company == null) {
                return Result.fail("未找到该企业信息");
            }
            // 隐藏敏感字段（密码）
            company.setLoginPassword(null); // 或设置为""
            return Result.ok(company);
        } catch (Exception e) {
            return Result.fail("查询企业信息异常：" + e.getMessage());
        }
    }

    @Override
    public Result deleteCompany(Integer id) {
        try {
            boolean success = removeById(id);
            return success ? Result.ok() : Result.fail("删除企业信息失败");
        } catch (Exception e) {
            return Result.fail("删除企业信息异常：" + e.getMessage());
        }
    }

    @Override
    public Result updateCompany(CompanyInfo companyInfo) {
        try {
            // 1. 校验企业ID是否存在
            if (companyInfo.getId() == null) {
                return Result.fail("企业ID不能为空");
            }
            CompanyInfo oldCompany = getById(companyInfo.getId());
            if (oldCompany == null) {
                return Result.fail("企业不存在，无法修改");
            }

            // 2. 核心：强制清除密码字段（禁止管理员修改密码）
            // 无论前端是否传递loginPassword，都用旧密码覆盖（保持密码不变）
            companyInfo.setLoginPassword(oldCompany.getLoginPassword());

            // 3. 只更新非密码字段（如名称、类型、地址等）
            boolean success = updateById(companyInfo);
            return success ? Result.ok("修改成功") : Result.fail("修改企业信息失败");
        } catch (Exception e) {
            log.error("修改企业信息异常", e); // 日志记录详细异常
            return Result.fail("修改企业信息失败，请联系管理员");
        }
    }


	@Override
	public List<CompanyInfo> listByAddress(String cityId) {
		List<CompanyInfo> companyInfos = baseMapper.selectList(new QueryWrapper<CompanyInfo>().eq("city_id", cityId));
		return companyInfos;
	}
}
